package negocio.entidades;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Cacheable;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;

import negocio.enums.PerfilUsuario;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;

@Entity
@Cacheable(false)
public class Usuario implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private long id;
	
	@NotEmpty
	@Column(unique=true)
	private String matricula;
	
	@Enumerated(EnumType.STRING)
	@NotNull
	private PerfilUsuario perfil;
	
	@NotEmpty
	private String nome;
	
	@Column(unique=true)
	@Length(min=3, max=50)
	private String usuario;
	
	@NotEmpty
	@Length(min=3, max=50)
	private String senha;
	
	@Email
	@NotEmpty
	private String email;
	
	@Lob
	private byte[] foto;
	
	private boolean status = false;

	@Temporal(TemporalType.DATE)
	private Date dtCadastro;
	
	//------------------relacionamentos---------------------//
	@OneToMany(fetch = FetchType.LAZY,cascade=CascadeType.ALL)
	private List<Notificacao> notificacoes = new ArrayList<Notificacao>();
	
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "aluno")
	private List<Matricula> matriculas = new ArrayList<Matricula>();
	
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "professor")
	private List<Disciplina> disciplinas = new ArrayList<Disciplina>();

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getMatricula() {
		return matricula;
	}

	public void setMatricula(String matricula) {
		this.matricula = matricula;
	}

	public PerfilUsuario getPerfil() {
		return perfil;
	}

	public void setPerfil(PerfilUsuario perfil) {
		this.perfil = perfil;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getUsuario() {
		return usuario;
	}

	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public byte[] getFoto() {
		return foto;
	}

	public void setFoto(byte[] foto) {
		this.foto = foto;
	}

	public boolean getStatus() {
		return status;
	}

	public void setStatus(boolean status) {
		this.status = status;
	}

	public Date getDtCadastro() {
		return dtCadastro;
	}

	public void setDtCadastro(Date dtCadastro) {
		this.dtCadastro = dtCadastro;
	}

	public List<Notificacao> getNotificacoes() {
		if ( notificacoes == null){
			notificacoes = new ArrayList<Notificacao>();
		}
		return notificacoes;
	}

	public void setNotificacoes(List<Notificacao> notificacoes) {
		this.notificacoes = notificacoes;
	}

	public List<Matricula> getMatriculas() {
		return matriculas;
	}

	public void setMatriculas(List<Matricula> matriculas) {
		this.matriculas = matriculas;
	}

	public List<Disciplina> getDisciplinas() {
		return disciplinas;
	}

	public void setDisciplinas(List<Disciplina> disciplinas) {
		this.disciplinas = disciplinas;
	}	
}
